package com.xbongbong.saas.toolbox.help;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.toolbox.util.DateUtil;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.enums.ReportTypeEnum;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author zcp
 * @version v1.0
 * @date 2019/2/15 14:43
 * @since v1.0
 */
public class BasicHelper {

    /**
     * 判断当天是周末，日   分别2 1 表示     （优先级2 > 1）
     * 因此，如果返回1，则推送昨日数据；如果返回2，则推送上周数据
     *
     * @param now 时间戳
     * @return int 返回1，则推送昨日数据；如果返回2，则推送上周数据
     * @author cp.zhang
     * 创建时间：2017-8-28 下午1:59:36
     * 修改时间：
     * @since 3.11.2
     * @version
     */
    public static Integer getTimeType(Integer now) {
        Integer week = DateUtil.getWeekInSomeday(now);

        Integer weekStart = 1;
        if (week.equals(weekStart)) {
            //周WEEK_START统计上周数据
            return ReportTypeEnum.WEEK.getCode();
        }
        return ReportTypeEnum.DAY.getCode();
    }

    /**
     * 计算出日/周的开始结束时间
     *
     * @param timeType 统计类型 1，则推送昨日数据；如果返回2，则推送上周数据
     * @return
     * @author cp.zhang
     * 创建时间：2017-8-28 下午3:03:14
     * 修改时间：
     * @since 3.11.2
     * @version
     */
    public static Map<String, Integer> getDayStartAndEnd4Report(Integer timeType) {
        Integer now = DateUtil.getTodayInt();
        Integer start = 0;
        Integer end = 0;
        /**
          timeType=1，则推送昨日数据；timeType=2，则推送上周数据
         */
        ReportTypeEnum reportTypeEnum = ReportTypeEnum.getByCode(timeType);
        switch (reportTypeEnum) {
            case DAY:
                //上一天end即今日0点
                end = now;
                start = now - 86400;
                break;
            case WEEK:
                start = DateUtil.getWeekMorningInSomeday(now - 86400);
                end = start + 7 * 86400;
                break;
            default:
                break;
        }
        Map<String, Integer> ret = new HashMap<>(16);
        ret.put("start", start);
        ret.put("end", end);
        return ret;
    }

    /**
     * 格式化标题格式，封装为key、value形式
     * @param key 标题对应的key值，一般用英文
     * @param value 标题显示文字
     * @return JSONObject，内部包含key、value
     * @throws 
     * 
     * @author hongxiao
     * @date: 2019-02-19 13:50
     * @since v1.0
     * @version v1.0
     */
    public static JSONObject formatTitle(String key, Object value) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("key", key);
        jsonObject.put("value", value);
        return jsonObject;
    }

    /**
     * 通过模拟分页查询一个业务的list
     * @param param 查询条件
     * @param iModel 业务model
     * @return 业务list
     * @throws
     *
     * @author hongxiao
     * @date: 2019-02-19 16:41
     * @since v1.0
     * @version v1.0
     */
    public static List<?> findEntitysByImitatePage(Map<String, Object> param, IModel iModel) {
        //每次查询5000条
        return findEntitysByImitatePage(param, iModel, 5000);
    }
    /**
     * 通过模拟分页查询一个业务的list
     * @param param 查询条件
     * @param iModel 业务model
     * @param pageNum 每页要查询的数量
     * @return 业务list
     * @throws
     *
     * @author hongxiao
     * @since v1.0
     * @version v1.0
     * @update by zcp 增加pageNum入参，控制每页查询数量
     */
    public static List<?> findEntitysByImitatePage(Map<String, Object> param, IModel iModel, Integer pageNum) {
        List<?> list = new ArrayList<>();
        Integer start = 0;
        for(;; start = start + pageNum){
            param.put("start", start);
            param.put("pageNum", pageNum);
            List perList = iModel.findEntitys(param);
            if (Objects.isNull(perList)) {
                break;
            }
            list.addAll(perList);
            //查询出的结果少于步长，肯定是没有数据了
            if (perList.size() < pageNum) {
                break;
            }
        }
        return list;
    }

    /**
     * 获取币种汇率
     * @param currency    业务内选择的币种
     * @param currencyRateMap 币种id--币种汇率
     * @return double
     * @author zcp
     * @date 2017-11-21 下午2:10:12
     * @version v1.0
     * @since v1.0
     */
    public static Double getExchangeRateByCurrency(Long currency, Map<Long, Double> currencyRateMap) {
        double rate = 1.0d;

        if (currency == null || currency.equals(0L) || currencyRateMap == null || currencyRateMap.get(currency) == null) {
            return rate;
        }

        return currencyRateMap.get(currency);
    }
    /**
     * 把amount按照币种汇率rate转换为当前本币（人民币）金额
     * @param amount 金额
     * @param currency 当前金额的币种id
     * @param currencyRateMap 币种id--币种汇率
     * @return double 当前本币（人民币）金额
     * @author zcp
     * @date 2019/2/27 15:16
     * @since v1.0
     * @version v1.0
     */
    public static double getAmountByExchangeRate(Double amount, Long currency, Map<Long, Double> currencyRateMap) {
        //币种汇率
        Double exchangeRate = getExchangeRateByCurrency(currency, currencyRateMap);
        //把amount按照币种汇率rate转换为相应币种金额
        return getAmountByExchangeRate(amount, exchangeRate);
    }
    /**
     * 把amount按照币种汇率rate转换为当前本币（人民币）金额
     * @param amount 金额
     * @param exchangeRate 币种汇率
     * @return double
     * @author zcp
     * @date 2019/2/28 17:31
     * @since v1.0
     * @version v1.0
     */
    public static double getAmountByExchangeRate(Double amount, Double exchangeRate) {
        if (exchangeRate == null || exchangeRate == 0) {
            return amount;
        }
        if (amount == null || amount == 0) {
            return 0;
        }
        //把amount按照币种汇率rate转换为相应币种金额
        return amount / exchangeRate;
    }
}
